﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using vudu.Logica.Clases;
using vudu.ClasesDominio;

namespace vudu.Datos.SqlServer
{
    /// <summary>
    /// Clase que contiene los metodos basicos para el caso de uso de gestionar Seccion Materia
    /// (Agregar,Modificar,Eliminar,Consultar)
    /// </summary>
    public class SqlServerSeccionMateria
    {
        Conexion conex = new Conexion();
        private List<SeccionMateria> seccion; //se usa para insertar

        #region Funcion hecha por el grupo 1 , necesaria para conocer las secciones de un profesor
        /// <summary>
        /// Este metodo consulta una evaluacion en la base de datos
        /// </summary>
        /// <returns>retorna un objeto de tipo evaluacion</returns>
        public List<SeccionMateria> ConsultarSeccionProfesor(int idProfesor)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarSeccionesProfesor]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idProfesor", idProfesor);
                command.Parameters["@idProfesor"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<SeccionMateria> seccionesConsultados = new List<SeccionMateria>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMateria = new SeccionMateria();
                    seccionMateria.Profesor.Nombre = reader.GetString(0);
                    seccionMateria.Materia.Nombre = reader.GetString(1);
                    seccionMateria.Codigo = reader.GetInt32(2);
                    seccionMateria.IdSeccionMateria = reader.GetInt32(3);
                    seccionesConsultados.Add(seccionMateria);

                }
                return seccionesConsultados;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }
        #endregion

        #region metodos del grupo 5

        public SeccionMateria ConsultarSeccionParticular(String numero, String periodo, String materia, String profesor)
        {
            SeccionMateria seccion = new SeccionMateria();

            SqlCommand command = new SqlCommand();

            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM SECCIONMATERIA S WHERE S.numeroSeccion = " + numero + "AND S.fk_PeriodoAcademico = '" + periodo + "' AND S.fk_Materia = " + materia + " AND S.fk_Profesor = " + profesor;
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMat = new SeccionMateria();
                    seccionMat.IdSeccionMateria = reader.GetInt32(0);
                    seccionMat.Codigo = reader.GetInt32(1);
                    seccionMat.PeriodoAcademico = reader["fk_PeriodoAcademico"].ToString();
                    seccionMat.Profesor.Cedula = reader.GetInt32(3);
                    seccionMat.Materia.Codigo = reader.GetInt32(4);
                    seccion = seccionMat;
                }
                reader.Close();
                seccion.BuscarProfesorMateria(seccion.PeriodoAcademico);
                if (seccion.IdSeccionMateria == null)
                    return null;
                else
                    return seccion;
            }
            catch (SqlException ex)
            {
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        //Metodo que inserta en la tabla SeccionMateria
        public bool AgregarSeccionMateria(SeccionMateria seccionMateria)
        {
            SqlCommand comando = new SqlCommand();
            String sql = "INSERT INTO SECCIONMATERIA(fk_PeriodoAcademico,numeroSeccion,fk_Profesor,fk_Materia) ";
            sql = sql + "VALUES ('" + seccionMateria.PeriodoAcademico + "'," + seccionMateria.Codigo
                                   + "," + seccionMateria.Profesor.Cedula + "," + seccionMateria.Materia.Codigo + ")";
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                return true;
            }
            catch (SqlException ex)
            {
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        //Metodo Consulta todas las secciones
        public List<SeccionMateria> ConsultarSeccionesMateria()
        {
            List<SeccionMateria> lista = new List<SeccionMateria>();

            SqlCommand command = new SqlCommand();

            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM SeccionMateria";
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMat = new SeccionMateria();
                    seccionMat.IdSeccionMateria = reader.GetInt32(0);
                    seccionMat.Codigo = reader.GetInt32(1);
                    seccionMat.PeriodoAcademico = reader["fk_PeriodoAcademico"].ToString();
                    seccionMat.Profesor.Cedula = reader.GetInt32(3);
                    seccionMat.Materia.Codigo = reader.GetInt32(4);
                    lista.Add(seccionMat);
                }
                reader.Close();
                foreach (SeccionMateria secc in lista)
                {
                    secc.BuscarProfesorMateria(secc.PeriodoAcademico);
                }
                if (lista.ElementAt(0).Codigo == null)
                {
                    return null;
                }
                else
                    return lista;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }


        }

        //Metodo que consulta todas las secciones de una materia especifica
        public List<SeccionMateria> ConsultarSeccionesDeUnaMateria(Materia materia)
        {
            List<SeccionMateria> lista = new List<SeccionMateria>();

            SqlCommand command = new SqlCommand();
            try
            {
                materia = new SqlServerMateria().ConsultarMateria(materia.Nombre, 1);
                command.Connection = conex.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT * FROM SECCIONMATERIA S WHERE S.fk_Materia = " + materia.Codigo;
                command.CommandTimeout = 10;
                try
                {
                    conex.AbrirConexionBd();
                    SqlDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        SeccionMateria seccionMat = new SeccionMateria();
                        seccionMat.IdSeccionMateria = reader.GetInt32(0);
                        seccionMat.Codigo = reader.GetInt32(1);
                        seccionMat.PeriodoAcademico = reader["fk_PeriodoAcademico"].ToString();
                        seccionMat.Profesor.Cedula = reader.GetInt32(3);
                        seccionMat.Materia.Codigo = reader.GetInt32(4);
                        lista.Add(seccionMat);
                    }
                    reader.Close();
                    foreach (SeccionMateria secc in lista)
                    {
                        secc.BuscarProfesorMateria(secc.PeriodoAcademico);
                    }
                    if (lista.ElementAt(0).Codigo == null)
                    {
                        return null;
                    }
                    else
                        return lista;
                }
                catch (SqlException)
                {
                    return null;
                }
                catch (Exception)
                {
                    return null;
                }
                finally
                {
                    conex.CerrarConexionBd();
                }
            }
            catch (Exception)
            {
                return null;
            }
        }

        //metodo que devuleve una lista con las secciones de un profesor
        public List<SeccionMateria> ConsultarSeccionesDeUnProfesor(Profesor profesor)
        {
            List<SeccionMateria> lista = new List<SeccionMateria>();

            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM SECCIONMATERIA S WHERE S.fk_Profesor = " + profesor.Cedula;
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMat = new SeccionMateria();
                    seccionMat.IdSeccionMateria = reader.GetInt32(0);
                    seccionMat.Codigo = reader.GetInt32(1);
                    seccionMat.PeriodoAcademico = reader["fk_PeriodoAcademico"].ToString();
                    seccionMat.Profesor.Cedula = reader.GetInt32(3);
                    seccionMat.Materia.Codigo = reader.GetInt32(4);
                    lista.Add(seccionMat);
                }
                reader.Close();
                foreach (SeccionMateria secc in lista)
                {
                    secc.BuscarProfesorMateria(secc.PeriodoAcademico);
                }
                if (lista.ElementAt(0).Codigo == null)
                {
                    return null;
                }
                else
                    return lista;
            }
            catch (SqlException ex)
            {
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        //Metodo devuleve objetode tipo SeccionMateria, datos de la seccion
        public SeccionMateria ConsultarSeccionMateria(int codigo)
        {
            SeccionMateria seccion = new SeccionMateria();

            SqlCommand command = new SqlCommand();

            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM SECCIONMATERIA S WHERE S.id_Seccion = " + codigo.ToString();
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMat = new SeccionMateria();
                    seccionMat.IdSeccionMateria = reader.GetInt32(0);
                    seccionMat.Codigo = reader.GetInt32(1);
                    seccionMat.PeriodoAcademico = reader["fk_PeriodoAcademico"].ToString();
                    seccionMat.Profesor.Cedula = reader.GetInt32(3);
                    seccionMat.Materia.Codigo = reader.GetInt32(4);
                    seccion = seccionMat;
                }
                reader.Close();
                seccion.BuscarProfesorMateria(seccion.PeriodoAcademico);
                return seccion;
            }
            catch (SqlException ex)
            {
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        //Metodo que le agrega los datos de un periodo a una seccion
        public String PeriodoSeccion(String codigo)
        {
            String periodo = "";
            DateTime ini = System.DateTime.Parse("01/01/2001");
            DateTime fin = System.DateTime.Parse("01/01/2001");
            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM PERIODOACADEMICO P WHERE P.ID_PERIODOACADEMICO = " + codigo;
            command.CommandTimeout = 10;
            conex.AbrirConexionBd();
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                String id = reader["ID_PERIODOACADEMICO"].ToString();
                ini = reader.GetDateTime(1);
                fin = reader.GetDateTime(2);
                int fk = reader.GetInt32(3);
            }
            reader.Close();
            periodo = ini.Day.ToString() + "/" + ini.Month.ToString() + "/" + ini.Year.ToString() + " - " + fin.Day.ToString() + "/" + fin.Month.ToString() + "/" + fin.Year.ToString();
            return periodo;
        }

        //Metodo que devuelve una lista de String con los periodo en un formato especifico
        public List<String> Periodos()
        {
            List<String> periodos = new List<String>();
            String periodo = "";
            DateTime ini = System.DateTime.Parse("01/01/2001");
            DateTime fin = System.DateTime.Parse("01/01/2001");
            String id = "";
            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM PERIODOACADEMICO";
            command.CommandTimeout = 10;
            conex.AbrirConexionBd();
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                id = reader["ID_PERIODOACADEMICO"].ToString();
                ini = reader.GetDateTime(1);
                fin = reader.GetDateTime(2);
                int fk = reader.GetInt32(3);
                periodo = id + ": " + ini.Day.ToString() + "/" + ini.Month.ToString() + "/" + ini.Year.ToString() + " - " + fin.Day.ToString() + "/" + fin.Month.ToString() + "/" + fin.Year.ToString();
                periodos.Add(periodo);
            }
            reader.Close();
            if (periodos.ElementAt(0) == null)
            {
                return null;
            }
            else
                return periodos
                    ;
        }

        //Metodo que devuelve TRUE si el profesor ya da la materia para un periodo
        public bool ExisteLaSeccion(Profesor _profesor, Materia _materia, int _seccion, String _periodo)
        {
            bool existe = false;

            SeccionMateria seccion = null;

            SqlCommand command = new SqlCommand();

            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM SECCIONMATERIA S WHERE S.numeroSeccion = "
                                   + _seccion.ToString() + " AND S.fk_PeriodoAcademico = '" + _periodo
                                   + "' AND S.fk_Profesor = " + _profesor.Cedula.ToString() + "AND S.fk_Materia ="
                                   + _materia.Codigo.ToString();
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMat = new SeccionMateria();
                    seccionMat.IdSeccionMateria = reader.GetInt32(0);
                    seccionMat.Codigo = reader.GetInt32(1);
                    seccionMat.PeriodoAcademico = reader["fk_PeriodoAcademico"].ToString();
                    seccionMat.Profesor.Cedula = reader.GetInt32(3);
                    seccionMat.Materia.Codigo = reader.GetInt32(4);
                    seccion = seccionMat;
                }
                reader.Close();
                if (seccion != null)
                {
                    existe = true;
                    return existe;
                }
                else
                    return existe;
            }
            catch (SqlException ex)
            {
                return existe;
            }
            catch (Exception ex)
            {
                return existe;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        //Metodo que permite eliminar una seccion
        public int EliminarSeccionMateria(SeccionMateria seccion)
        {
            int horarios = new SqlServerHorarioClase().EliminarHorarioPorSeccion(seccion.IdSeccionMateria.ToString());
            SqlCommand comando = new SqlCommand();
            String sql = "DELETE FROM SECCIONMATERIA WHERE ID_SECCION = " + seccion.IdSeccionMateria;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                if (horarios == 0)
                    return 2;
                else
                    return 1;
            }
            catch (SqlException ex)
            {
                return 0;
            }
            catch (Exception ex)
            {
                return 0;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool ModificarSeccionMateria(List<String[]> campos, SeccionMateria seccion)
        {
            SqlCommand comando = new SqlCommand();
            String sql = null;
            bool estatusModificacion = false;
            foreach (String[] c in campos)
            {
                String campo = c[1];
                String valor = c[2];
                if (campo.Contains("Profesor"))
                {
                    sql = "update SeccionMateria set fk_Profesor = " + valor + " where id_Seccion = " + seccion.IdSeccionMateria;
                }
                else if (campo.Contains("Numero"))
                {
                    sql = "update SeccionMateria set numeroSeccion = " + valor + " where id_Seccion = " + seccion.IdSeccionMateria;
                }
                if (sql == null)
                {
                    estatusModificacion = false;
                }
                else
                {
                    comando.CommandText = sql;
                    comando.Connection = conex.ObjetoConexion();
                    try
                    {
                        conex.AbrirConexionBd();
                        comando.ExecuteNonQuery();
                        estatusModificacion = true;
                    }
                    catch (SqlException)
                    {
                        estatusModificacion = false;
                    }
                    catch (Exception)
                    {
                        estatusModificacion = false;
                    }
                    finally
                    {
                        conex.CerrarConexionBd();
                    }
                }
                if (estatusModificacion == false)
                {
                    return estatusModificacion;
                }
            }
            return estatusModificacion;
        }

        public List<SeccionMateria> ConsultarSeccionesEstudiante(String id_estudiante)
        {
            List<SeccionMateria> lista = new List<SeccionMateria>();

            SqlCommand command = new SqlCommand();

            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT S.id_Seccion, S.numeroSeccion, S.fk_PeriodoAcademico, S.fk_Profesor, S.fk_Materia FROM SECCIONMATERIA S, LISTADO L WHERE L.fk_id_estudiante = " + id_estudiante + " AND L.fk_id_seccion = S.id_Seccion";
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMat = new SeccionMateria();
                    seccionMat.IdSeccionMateria = reader.GetInt32(0);
                    seccionMat.Codigo = reader.GetInt32(1);
                    seccionMat.PeriodoAcademico = reader["fk_PeriodoAcademico"].ToString();
                    seccionMat.Profesor.Cedula = reader.GetInt32(3);
                    seccionMat.Materia.Codigo = reader.GetInt32(4);
                    lista.Add(seccionMat);
                }
                reader.Close();
                foreach (SeccionMateria secc in lista)
                {
                    secc.BuscarProfesorMateria(secc.PeriodoAcademico);
                }
                return lista;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }
        
        #endregion metodos del grupo 5
    }

}